import winreg
import logging

# 在这个改进版本中，我们引入了 logging 模块来记录错误信息，并为 get_reg_val 函数添加了一个默认值参数。
# 这使得代码更具可读性和易于维护，并提供了更好的日志管理功能。

logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")


# 定义一个函数，用于获取注册表值
# 参数：full_key_path：注册表键路径；value_name：注册表值名称；default_value：默认值，默认为None
# 返回值：注册表值
def get_reg_val(full_key_path, value_name, default_value=None):
    '''
    获取注册表值
    :param full_key_path: 注册表键路径
    :param value_name: 注册表值名称
    :param default_value: 默认值，默认为None
    :return: 注册表值
    '''
    root, path = full_key_path.split("\\", 1)
    root_keys_map = {
        "HKLM": winreg.HKEY_LOCAL_MACHINE,
        "HKEY_LOCAL_MACHINE": winreg.HKEY_LOCAL_MACHINE,
        "HKCU": winreg.HKEY_CURRENT_USER,
        "HKEY_CURRENT_USER": winreg.HKEY_CURRENT_USER,
        "HKCR": winreg.HKEY_CLASSES_ROOT,
        "HKEY_CLASSES_ROOT": winreg.HKEY_CLASSES_ROOT,
        "HKCC": winreg.HKEY_CURRENT_CONFIG,
        "HKEY_CURRENT_CONFIG": winreg.HKEY_CURRENT_CONFIG,
        "HKU": winreg.HKEY_USERS,
        "HKEY_USERS": winreg.HKEY_USERS,
    }
    try:
        root_key = root_keys_map[root]
    except KeyError:
        logging.error("无效的根键")
        return default_value
    try:
        with winreg.OpenKey(root_key, path) as reg_key:
            val, typ = winreg.QueryValueEx(reg_key, value_name)
            return val
    except FileNotFoundError:
        logging.warning(f"找不到注册表键: {full_key_path}\\{value_name}")
        return default_value
    except PermissionError as pe:
        logging.warning(f"无权访问注册表键：{pe}")
        return default_value
    except OSError as oe:
        logging.error(f"操作系统错误：{oe}")
        return default_value
    except Exception as e:
        logging.error(f"未知错误：{e}")
        return default_value


def get_product_name():
    """
    获取产品名称
    :return: 注册表ProductName值的数据
    """
    key1 = r"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
    val1 = "ProductName"
    product_name = get_reg_val(key1, val1)
    return product_name or "未找到产品名称"


def get_safe_search_mode():
    key2 = r"HKCU\Software\Microsoft\Windows\CurrentVersion\SearchSettings"
    val2 = "SafeSearchMode"
    safe_search_mode = get_reg_val(key2, val2, default_value="未知")
    return safe_search_mode


def get_restart_explorer():
    key3 = r"HKEY_CLASSES_ROOT\Directory\Background\shell\RestartExplorer"
    val3 = ""
    restart_explorer = get_reg_val(key3, val3)
    return restart_explorer or "未找到重启资源管理器"


def get_initial_keyboard_indicators():
    key4 = r"HKU\.DEFAULT\Control Panel\Keyboard"
    val4 = "InitialKeyboardIndicators"
    initial_keyboard_indicators = get_reg_val(key4, val4, default_value="未知")
    return initial_keyboard_indicators


if __name__ == "__main__":
    print(f"产品名称: {get_product_name()}")
    print(f"安全搜索模式: {get_safe_search_mode()}")
    print(f"重启资源管理器: {get_restart_explorer()}")
    print(f"初始键盘指示符: {get_initial_keyboard_indicators()}")